/**
 * 创建初始管理员用户脚本
 * 用于在系统首次部署时创建默认管理员账户
 */

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const dotenv = require('dotenv');

// 加载环境变量
dotenv.config();

// 连接数据库 - 使用更详细的连接选项
const mongoUri = process.env.MONGO_URI || 'mongodb://admin:password@localhost:27017/spiritual_insight_dev?authSource=spiritual_insight_dev';
console.log('正在连接数据库:', mongoUri);

// 添加连接事件监听
mongoose.connection.on('connected', () => {
    console.log('MongoDB 连接成功');
});

mongoose.connection.on('error', (err) => {
    console.error('MongoDB 连接错误:', err);
});

mongoose.connection.on('disconnected', () => {
    console.log('MongoDB 连接断开');
});

// 管理员用户模型
const adminUserSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true,
        trim: true,
        minlength: 3,
        maxlength: 50
    },
    password: {
        type: String,
        required: true
    },
    role: {
        type: String,
        enum: ['superadmin', 'admin', 'editor'],
        default: 'admin'
    },
    status: {
        type: String,
        enum: ['active', 'inactive', 'locked'],
        default: 'active'
    },
    lastLogin: {
        type: Date
    },
    createdAt: {
        type: Date,
        default: Date.now
    },
    updatedAt: {
        type: Date,
        default: Date.now
    }
}, {
    timestamps: true
});

// 密码加密中间件
adminUserSchema.pre('save', async function(next) {
    if (!this.isModified('password')) {
        return next();
    }
    
    try {
        const saltRounds = parseInt(process.env.BCRYPT_SALT_ROUNDS) || 12;
        const hashedPassword = await bcrypt.hash(this.password, saltRounds);
        this.password = hashedPassword;
        next();
    } catch (error) {
        next(error);
    }
});

const AdminUser = mongoose.model('AdminUser', adminUserSchema);

/**
 * 创建管理员用户
 * @param {string} username - 用户名
 * @param {string} password - 密码
 * @param {string} role - 角色
 */
async function createAdminUser(username, password, role = 'superadmin') {
    try {
        console.log(`正在检查用户是否存在: ${username}`);
        // 检查是否已存在同名用户
        const existingUser = await AdminUser.findOne({ username });
        if (existingUser) {
            console.log(`管理员用户 '${username}' 已存在`);
            return;
        }

        console.log(`正在创建新管理员用户: ${username}`);
        // 创建新管理员用户
        const adminUser = new AdminUser({
            username,
            password,
            role,
            status: 'active'
        });

        await adminUser.save();
        console.log(`成功创建管理员用户: ${username} (角色: ${role})`);
    } catch (error) {
        console.error('创建管理员用户失败:', error.message);
        throw error;
    }
}

/**
 * 主函数
 */
async function main() {
    const args = process.argv.slice(2);
    
    // 如果没有提供参数，使用默认值
    const username = args[0] || 'admin';
    const password = args[1] || 'admin123';
    const role = args[2] || 'superadmin';

    try {
        console.log('等待数据库连接...');
        // 等待数据库连接完成 - 增加更多连接选项
        await mongoose.connect(mongoUri, {
            serverSelectionTimeoutMS: 30000,     // 30秒服务器选择超时
            socketTimeoutMS: 45000,              // 45秒套接字超时
            connectTimeoutMS: 30000,             // 30秒连接超时
            directConnection: true               // 强制直接连接
        });
        
        // 连接成功后切换到指定数据库
        const db = mongoose.connection.useDb('spiritual-insight');
        console.log('数据库连接成功');
        console.log('开始创建管理员用户...');
        await createAdminUser(username, password, role);
        console.log('管理员用户创建完成');
    } catch (error) {
        console.error('创建管理员用户时发生错误:', error.message);
        console.log('\n请确保以下事项：');
        console.log('1. MongoDB服务正在运行');
        console.log('2. 数据库连接配置正确');
        console.log('3. 如果使用Docker，请运行: docker-compose up -d');
        console.log('4. 如果本地安装MongoDB，请确保服务已启动');
        process.exit(1);
    } finally {
        if (mongoose.connection.readyState === 1) {
            console.log('关闭数据库连接');
            await mongoose.connection.close();
        }
    }
}

// 执行主函数
if (require.main === module) {
    main();
}

module.exports = { createAdminUser };